--- title: "(70分 dp+贪心)倍数问题" created: 2025-11-28 tags: - 算法 --- # (70分 dp+贪心)倍数问题 ## 题目 [**倍数问题**](https://www.acwing.com/problem/content/description/1236/) ![[image-a7d6da0c.png]] ## 思路分析 ![[image-6eacd9b2.png]] 首先第一感觉就是 优先选更大的数 从大到小 三层枚举 5/13 ```typescript #include using namespace std; typedef long long LL; const int N=1e5+10; LL a[N]; int n,m; int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1,greater()); for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ for(int k=j+1;k<=n;k++){ if((a[i]+a[j]+a[k])%m==0) cout< using namespace std; const int N=1e5+10, M=1010; int n, m; int a[N]; int main() { cin>>n>>m; for(int i=1;i<=n;i++) scanf("%d", &a[i]); vector>> f(n+1,vector> (4,vector(m,-2e9))); for(int i=0;i<=n;i++) f[i][0][0]=0; for(int i=1;i<=n;i++) for(int j=1;j<=3;j++) for(int k=0;k using namespace std; const int N=1e5+10, M=1010; int n, m; int a[N]; int f[5][M]; int main() { cin>>n>>m; for(int i=1;i<=n;i++) scanf("%d", &a[i]); memset(f,-0x3f,sizeof f); f[0][0]=0; for(int i=1;i<=n;i++) for(int j=3;j>=1;j--) for(int k=0;k using namespace std; const int N=1e5+10, M=1010; int n, m; vector a[N]; int f[5][M]; int main() { cin>>n>>m; for(int i=0;i>x; a[x%m].push_back(x); } memset(f,-0x3f,sizeof f); f[0][0]=0; for(int i=0;i=1;j--){ for(int k=0;k